<?php
declare (strict_types = 1);

namespace app\command;

use app\model\zs\ZsMemberCoupon;
use app\model\zs\ZsMemberCouponProvide;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
use think\facade\Db;

class CouponCalcSale extends Command
{
    protected function configure()
    {
        // 指令配置
        $this->setName('coupon:calc_sale')
            ->setDescription('member_coupon 表新加了 sale 字段，本命令用来批量统计并写入 sale 字段');
    }

    protected function execute(Input $input, Output $output)
    {
        // 更新条数
        $num = 0;

        $tid_arr = ZsMemberCouponProvide::where('create_at', '>=', '2021-06-01')->field(Db::raw('DISTINCT(`tid`) AS `dis_tid`'))->select()->column('dis_tid');
        // var_dump($tid_arr, count($tid_arr));
        // die;
        $list = ZsMemberCoupon::withCount('zsMemberCouponProvides')->whereIn('tid', $tid_arr)->where('tid', '<>', '20210617183730192364')->select();
        // var_dump(count($list));
        // die;
        // 必须使用引用传参 $num
        $list->each(function ($model_coupon) use (&$num) {
            // zs_member_coupon_provides_count是统计出的领取记录数
            if ($model_coupon->sale === $model_coupon->zs_member_coupon_provides_count) {
                // 不能返回 false，否则会终止循环
                return;
            }
            $model_coupon->sale = $model_coupon->zs_member_coupon_provides_count;
            $model_coupon->save();
            ++$num;
        });

        // 指令输出
        $output->writeln("更新 {$num} 条");
    }
}
